package hr.fer.zpr.nmbp.project1.bll;

import hr.fer.zpr.nmbp.project1.bll.exceptions.BLLException;
import hr.fer.zpr.nmbp.project1.dao.DAOFactory;
import hr.fer.zpr.nmbp.project1.dao.LijecnikDAO;
import hr.fer.zpr.nmbp.project1.dao.exceptions.DAOException;
import hr.fer.zpr.nmbp.project1.model.Lijecnik;
import hr.fer.zpr.nmbp.project1.model.Pacijent;

import java.util.List;
import java.util.UUID;

public class LijecnikBLL {
	private LijecnikDAO lijecnikDAO = DAOFactory.getLijecnikDAO();
    
    public void save(Lijecnik lijecnik) {
    	if(!LijecnikBLL.validate(lijecnik)) {
    		throw new BLLException("Sva polja moraju biti popunjena.");
    	}
    	
    	lijecnik.setSifra(UUID.randomUUID().toString());
    	
    	if(!lijecnik.getBolnica().getLijecnici().contains(lijecnik)){
    		lijecnik.getBolnica().getLijecnici().add(lijecnik);
    	}
    	
    	for(Pacijent pacijent : lijecnik.getPacijenti()){
    		pacijent.setLijecnik(lijecnik);
    	}
    	
    	try {
            lijecnikDAO.save(lijecnik);
        } catch (DAOException ex) {
            throw new BLLException(ex.getMessage());
        }
    }
    
    public void update(Lijecnik lijecnik) {
    	
    	if(!LijecnikBLL.validate(lijecnik)) {
    		throw new BLLException("Sva polja moraju biti popunjena");
    	}
    	
    	Lijecnik proto = new Lijecnik();
    	proto.setSifra(lijecnik.getSifra());
    	List<Lijecnik> lijecniciFromDB = this.lijecnikDAO.load(proto);
    	
    	Lijecnik persistentLijecnik;
    	if(lijecniciFromDB.size() > 0){
    		persistentLijecnik = lijecniciFromDB.get(0);
    		persistentLijecnik.setBolnica(lijecnik.getBolnica());
    		persistentLijecnik.setIme(lijecnik.getIme());
    		persistentLijecnik.setPrezime(lijecnik.getPrezime());
    		
    		persistentLijecnik.getPacijenti().clear();
    		for(Pacijent pacijent : lijecnik.getPacijenti()){
    			persistentLijecnik.getPacijenti().add(pacijent);
    			pacijent.setLijecnik(persistentLijecnik);
    		}
    		
    		if(!persistentLijecnik.getBolnica().getLijecnici().contains(persistentLijecnik)){
    			persistentLijecnik.getBolnica().getLijecnici().add(persistentLijecnik);
        	}
    	}else{
    		throw new BLLException("Nepostojeći lijecnik u bazi podataka");
    	}
    	
        try {
            lijecnikDAO.save(persistentLijecnik);
        } catch (DAOException ex) {
            throw new BLLException(ex.getMessage());
        }
    }
    
    public void delete(Lijecnik lijecnik){    	
        try {
            lijecnikDAO.delete(lijecnik);
        } catch (DAOException ex) {
            throw new BLLException(ex.getMessage());
        }
    }
    
    public List<Lijecnik> loadAll() {
        return lijecnikDAO.loadAll();
    }
    
    public static boolean validate(Lijecnik lijecnik) {
    	if(lijecnik == null 
    		|| lijecnik.getIme() == null
    		|| lijecnik.getIme().isEmpty()
    		|| lijecnik.getPacijenti() == null
    		|| lijecnik.getPrezime().isEmpty()
    		|| lijecnik.getBolnica() == null) {
    		return false;
    	}else {
    		return true;
    	}
    }
}
